Project

This is our group’s project page for the topic on Geographically Weighted Regression

Team 5 … (Singapore Management University)https://www.smu.edu.sg
2021-11-16
packages = c('sf', 'tidyverse', 'readxl', 'tmap', 'raster', 'knitr', 'dplyr', 'olsrr','GWmodel','corrplot','ggpubr', 'spdep')
for (p in packages){
  if(!require(p, character.only = T)){
    install.packages(p)
  }
  library(p,character.only = T)
}

COVID DATA

get.var <- function(vname,df) {
  v <- df[vname] %>% st_set_geometry(NULL)
  v <- unname(v[,1])
  return(v)
}

Meninggal function

unique_column_data_meninggal <- function(data) {
  thedata <- read_xlsx(data, sheet = "data", .name_repair = "minimal")

  names(thedata) <- make.unique(names(thedata))
  
  data_withmonyear <- thedata %>%
    mutate(thedata, Month = str_sub(data, 49, 51)) %>%
    mutate(thedata, Year = str_sub(data, -22, -19)) %>%
    mutate(thedata, Month_Year = paste(str_sub(data, 49, 51), str_sub(data, -22, -19), sep = "_", collapse = NULL))
  
  extracted_data <- dplyr::select(data_withmonyear, `ID_KEL`, `Nama_provinsi`, `nama_kota`, `nama_kecamatan`, `nama_kelurahan`, `POSITIF`, `Meninggal.1`, `Month`, `Year`, `Month_Year`) %>%
    rename(`Meninggal` = `Meninggal.1`) %>%
    drop_na()
    
  return(extracted_data)
}

LOAD MENINGGAL DATA

oct21 <- unique_column_data_meninggal("data/aspatial/Standar Kelurahan Data Corona (31 Oktober 2021 Pukul 10.00).xlsx")

geospatial

dkijkt_sf = st_read(dsn = "data/geospatial", layer = "BATAS_DESA_DESEMBER_2019_DUKCAPIL_DKI_JAKARTA")
Reading layer `BATAS_DESA_DESEMBER_2019_DUKCAPIL_DKI_JAKARTA' from data source `C:\JunLonggggg\IS415\IS415_project\data\Geospatial' 
  using driver `ESRI Shapefile'
Simple feature collection with 269 features and 161 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 106.3831 ymin: -6.370815 xmax: 106.9728 ymax: -5.184322
Geodetic CRS:  WGS 84
st_crs(dkijkt_sf)
Coordinate Reference System:
  User input: WGS 84 
  wkt:
GEOGCRS["WGS 84",
    DATUM["World Geodetic System 1984",
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1]]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["latitude",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["longitude",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    ID["EPSG",4326]]
dkijkt_sf23845 <- st_transform(dkijkt_sf, crs = 23845)
dkijkt_sf23845_main1 <- filter(dkijkt_sf23845, KAB_KOTA != "KEPULAUAN SERIBU")
dkijkt_sf23845_main <- dkijkt_sf23845_main1[1:9]
dkijkt_sf23845_main
Simple feature collection with 261 features and 9 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -3644275 ymin: 663887.8 xmax: -3606237 ymax: 701380.1
Projected CRS: DGN95 / Indonesia TM-3 zone 54.1
First 10 features:
   OBJECT_ID  KODE_DESA               DESA   KODE    PROVINSI
1      25477 3173031006          KEAGUNGAN 317303 DKI JAKARTA
2      25478 3173031007             GLODOK 317303 DKI JAKARTA
3      25397 3171031003      HARAPAN MULIA 317103 DKI JAKARTA
4      25400 3171031006       CEMPAKA BARU 317103 DKI JAKARTA
5      25390 3171021001         PASAR BARU 317102 DKI JAKARTA
6      25391 3171021002       KARANG ANYAR 317102 DKI JAKARTA
7      25394 3171021005 MANGGA DUA SELATAN 317102 DKI JAKARTA
8      25386 3171011003       PETOJO UTARA 317101 DKI JAKARTA
9      25403 3171041001              SENEN 317104 DKI JAKARTA
10     25408 3171041006             BUNGUR 317104 DKI JAKARTA
        KAB_KOTA   KECAMATAN         DESA_KELUR JUMLAH_PEN
1  JAKARTA BARAT  TAMAN SARI          KEAGUNGAN      21609
2  JAKARTA BARAT  TAMAN SARI             GLODOK       9069
3  JAKARTA PUSAT   KEMAYORAN      HARAPAN MULIA      29085
4  JAKARTA PUSAT   KEMAYORAN       CEMPAKA BARU      41913
5  JAKARTA PUSAT SAWAH BESAR         PASAR BARU      15793
6  JAKARTA PUSAT SAWAH BESAR       KARANG ANYAR      33383
7  JAKARTA PUSAT SAWAH BESAR MANGGA DUA SELATAN      35906
8  JAKARTA PUSAT      GAMBIR       PETOJO UTARA      21828
9  JAKARTA PUSAT       SENEN              SENEN       8643
10 JAKARTA PUSAT       SENEN             BUNGUR      23001
                         geometry
1  MULTIPOLYGON (((-3626874 69...
2  MULTIPOLYGON (((-3627130 69...
3  MULTIPOLYGON (((-3621251 68...
4  MULTIPOLYGON (((-3620608 69...
5  MULTIPOLYGON (((-3624097 69...
6  MULTIPOLYGON (((-3624785 69...
7  MULTIPOLYGON (((-3624752 69...
8  MULTIPOLYGON (((-3626121 69...
9  MULTIPOLYGON (((-3623189 69...
10 MULTIPOLYGON (((-3622451 69...
dkijkt_covid <- left_join(dkijkt_sf23845_main, oct21, by = c("KODE_DESA" = "ID_KEL"))
dkijkt_ctrd <- st_centroid(dkijkt_covid, of_largest_polygon = TRUE)
# write.csv(dkijkt_ctrd, "data/dkijkt_ctrd.csv", row.names = FALSE)
# st_write(dkijkt_ctrd, "data/dkijkt_ctrd_xy.csv", layer_options = "GEOMETRY=AS_XY")
dkijkt_covid_testing <- read_csv("data/dkijkt_ctrd.csv")
dkijkt_covid_testing <- read_csv("data/dkijkt_ctrd_xy.csv")

dkijkt_covid_testing1 <- st_as_sf(dkijkt_covid_testing,
                          coords = c("X", 
                                     "Y"),
                          crs=23845)
tmap_mode("view")
tm_shape(dkijkt_covid_testing1)+
  tm_dots()
tmap_mode("plot")

Points of Interests

pointsofint_sf = st_read(dsn = "data/points_of_interests", layer = "hotosm_idn_jakarta_points_of_interest_points")
Reading layer `hotosm_idn_jakarta_points_of_interest_points' from data source `C:\JunLonggggg\IS415\IS415_project\data\points_of_interests' 
  using driver `ESRI Shapefile'
Simple feature collection with 14308 features and 14 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 106.4603 ymin: -6.589763 xmax: 107.2299 ymax: -5.92723
Geodetic CRS:  WGS 84

Attraction

attraction <- pointsofint_sf %>% filter(tourism == "attraction")
dkijkt_covid_geo <- dkijkt_covid_testing1$geometry
dkijkt_covid1 <- st_coordinates(dkijkt_covid_geo)
dkijkt_covid2 <- dkijkt_covid1[,1:2]
attraction_df <- attraction$geometry
correctgeo <- st_as_sf(attraction_df, crs=4326) %>%
                st_transform(crs = 23845)
attractiongeo <- st_coordinates(correctgeo)
dist_dkijkt_attraction <- spDists(dkijkt_covid2, attractiongeo, longlat=FALSE)
dist_dkijkt_attraction_df <- data.frame(dist_dkijkt_attraction)

dist_dkijkt_attractiont_min <- dist_dkijkt_attraction_df %>% rowwise() %>% mutate(Min = min(c_across(X1:X191)))

PROX_ATTRACTION <- dist_dkijkt_attractiont_min$Min/1000
dkijkt_covid_updated <- cbind(dkijkt_covid_testing1, PROX_ATTRACTION)

Place of Worship

placeofworship <- pointsofint_sf %>% filter(amenity == "place_of_worship")
dkijkt_covid_geo <- dkijkt_covid_testing1$geometry
dkijkt_covid1 <- st_coordinates(dkijkt_covid_geo)
dkijkt_covid2 <- dkijkt_covid1[,1:2]
placeofworship_df <- placeofworship$geometry
correctgeo <- st_as_sf(placeofworship_df, crs=4326) %>%
                st_transform(crs = 23845)
placeofworshipgeo <- st_coordinates(correctgeo)
dist_dkijkt_placeofworship <- spDists(dkijkt_covid2, placeofworshipgeo, longlat=FALSE)
dist_dkijkt_placeofworship_df <- data.frame(dist_dkijkt_placeofworship)

dist_dkijkt_placeofworship_min <- dist_dkijkt_placeofworship_df %>% rowwise() %>% mutate(Min = min(c_across(X1:X422)))

PROX_WORSHIP <- dist_dkijkt_placeofworship_min$Min/1000
dkijkt_covid_updated <- cbind(dkijkt_covid_updated, PROX_WORSHIP)

Restaurant

restaurant <- pointsofint_sf %>% filter(amenity == "restaurant")
dkijkt_covid_geo <- dkijkt_covid_testing1$geometry
dkijkt_covid1 <- st_coordinates(dkijkt_covid_geo)
dkijkt_covid2 <- dkijkt_covid1[,1:2]
restaurant_df <- restaurant$geometry
correctgeo <- st_as_sf(restaurant_df, crs=4326) %>%
                st_transform(crs = 23845)
restaurantgeo <- st_coordinates(correctgeo)
dist_dkijkt_restaurant <- spDists(dkijkt_covid2, restaurantgeo, longlat=FALSE)
dist_dkijkt_restaurant_df <- data.frame(dist_dkijkt_restaurant)

dist_dkijkt_restaurant_min <- dist_dkijkt_restaurant_df %>% rowwise() %>% mutate(Min = min(c_across(X1:X1082)))

PROX_RESTAURANT <- dist_dkijkt_restaurant_min$Min/1000
dkijkt_covid_updated <- cbind(dkijkt_covid_updated, PROX_RESTAURANT)

Mall

mall <- pointsofint_sf %>% filter(shop == "mall")
dkijkt_covid_geo <- dkijkt_covid_testing1$geometry
dkijkt_covid1 <- st_coordinates(dkijkt_covid_geo)
dkijkt_covid2 <- dkijkt_covid1[,1:2]
mall_df <- mall$geometry
correctgeo <- st_as_sf(mall_df, crs=4326) %>%
                st_transform(crs = 23845)
mallgeo <- st_coordinates(correctgeo)
dist_dkijkt_mall <- spDists(dkijkt_covid2, mallgeo, longlat=FALSE)
dist_dkijkt_mall_df <- data.frame(dist_dkijkt_mall)

dist_dkijkt_mall_min <- dist_dkijkt_mall_df %>% rowwise() %>% mutate(Min = min(c_across(X1:X95)))

PROX_MALL <- dist_dkijkt_mall_min$Min/1000
dkijkt_covid_updated <- cbind(dkijkt_covid_updated, PROX_MALL)

Supermarket

supermarket <- pointsofint_sf %>% filter(shop == "supermarket")
dkijkt_covid_geo <- dkijkt_covid_testing1$geometry
dkijkt_covid1 <- st_coordinates(dkijkt_covid_geo)
dkijkt_covid2 <- dkijkt_covid1[,1:2]
supermarket_df <- supermarket$geometry
correctgeo <- st_as_sf(supermarket_df, crs=4326) %>%
                st_transform(crs = 23845)
supermarketgeo <- st_coordinates(correctgeo)
dist_dkijkt_supermarket <- spDists(dkijkt_covid2, supermarketgeo, longlat=FALSE)
dist_dkijkt_supermarket_df <- data.frame(dist_dkijkt_supermarket)

dist_dkijkt_supermarket_min <- dist_dkijkt_supermarket_df %>% rowwise() %>% mutate(Min = min(c_across(X1:X261)))

PROX_SUPERMARKET <- dist_dkijkt_supermarket_min$Min/1000
dkijkt_covid_updated <- cbind(dkijkt_covid_updated, PROX_SUPERMARKET)

Convenience

convenience <- pointsofint_sf %>% filter(shop == "convenience")
dkijkt_covid_geo <- dkijkt_covid_testing1$geometry
dkijkt_covid1 <- st_coordinates(dkijkt_covid_geo)
dkijkt_covid2 <- dkijkt_covid1[,1:2]
convenience_df <- convenience$geometry
correctgeo <- st_as_sf(convenience_df, crs=4326) %>%
                st_transform(crs = 23845)
conveniencegeo <- st_coordinates(correctgeo)
dist_dkijkt_convenience <- spDists(dkijkt_covid2, conveniencegeo, longlat=FALSE)
dist_dkijkt_convenience_df <- data.frame(dist_dkijkt_convenience)

dist_dkijkt_convenience_min <- dist_dkijkt_convenience_df %>% rowwise() %>% mutate(Min = min(c_across(X1:X848)))

PROX_CONVENIENCE <- dist_dkijkt_convenience_min$Min/1000
dkijkt_covid_updated <- cbind(dkijkt_covid_updated, PROX_CONVENIENCE)

Education

education_sf = st_read(dsn = "data/education", layer = "hotosm_idn_jakarta_education_facilities_points")
Reading layer `hotosm_idn_jakarta_education_facilities_points' from data source `C:\JunLonggggg\IS415\IS415_project\data\education' 
  using driver `ESRI Shapefile'
Simple feature collection with 1149 features and 9 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 106.4604 ymin: -6.589763 xmax: 107.2294 ymax: -5.974051
Geodetic CRS:  WGS 84

Kindergartens

kindergartens <- education_sf %>% filter(amenity == "kindergarten")
dkijkt_covid_geo <- dkijkt_covid_testing1$geometry
dkijkt_covid1 <- st_coordinates(dkijkt_covid_geo)
dkijkt_covid2 <- dkijkt_covid1[,1:2]
kindergartens_df <- kindergartens$geometry
correctgeo <- st_as_sf(kindergartens_df, crs=4326) %>%
                st_transform(crs = 23845)
kindergartensgeo <- st_coordinates(correctgeo)
dist_dkijkt_kindergartens <- spDists(dkijkt_covid2, kindergartensgeo, longlat=FALSE)
dist_dkijkt_kindergartens_df <- data.frame(dist_dkijkt_kindergartens)

dist_dkijkt_kindergartens_min <- dist_dkijkt_kindergartens_df %>% rowwise() %>% mutate(Min = min(c_across(X1:X443)))

PROX_KINDERGARTENS <- dist_dkijkt_kindergartens_min$Min/1000
dkijkt_covid_updated <- cbind(dkijkt_covid_updated, PROX_KINDERGARTENS)

School

school <- education_sf %>% filter(amenity == "school")
dkijkt_covid_geo <- dkijkt_covid_testing1$geometry
dkijkt_covid1 <- st_coordinates(dkijkt_covid_geo)
dkijkt_covid2 <- dkijkt_covid1[,1:2]
school_df <- school$geometry
correctgeo <- st_as_sf(school_df, crs=4326) %>%
                st_transform(crs = 23845)
schoolgeo <- st_coordinates(correctgeo)
dist_dkijkt_school <- spDists(dkijkt_covid2, schoolgeo, longlat=FALSE)
dist_dkijkt_school_df <- data.frame(dist_dkijkt_school)

dist_dkijkt_school_min <- dist_dkijkt_school_df %>% rowwise() %>% mutate(Min = min(c_across(X1:X593)))

PROX_SCHOOL <- dist_dkijkt_school_min$Min/1000
dkijkt_covid_updated <- cbind(dkijkt_covid_updated, PROX_SCHOOL)

Airports

airport_sf = st_read(dsn = "data/airport", layer = "hotosm_idn_jakarta_airports_points")
Reading layer `hotosm_idn_jakarta_airports_points' from data source 
  `C:\JunLonggggg\IS415\IS415_project\data\airport' 
  using driver `ESRI Shapefile'
Simple feature collection with 177 features and 11 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 106.649 ymin: -6.554656 xmax: 107.1358 ymax: -6.113161
Geodetic CRS:  WGS 84
airport_sf <- st_as_sf(airport_sf, crs=4326) %>%
                st_transform(crs = 23845)

Terminal

terminal <- airport_sf %>% filter(aeroway == "terminal")
dkijkt_covid_geo <- dkijkt_covid_testing1$geometry
dkijkt_covid1 <- st_coordinates(dkijkt_covid_geo)
dkijkt_covid2 <- dkijkt_covid1[,1:2]
terminal_df <- terminal$geometry
correctgeo <- st_as_sf(terminal_df, crs=23845)
terminalgeo <- st_coordinates(correctgeo)
dist_dkijkt_terminal <- spDists(dkijkt_covid2, terminalgeo, longlat=FALSE)
dist_dkijkt_terminal_df <- data.frame(dist_dkijkt_terminal)

dist_dkijkt_terminal_min <- dist_dkijkt_terminal_df %>% rowwise() %>% mutate(Min = min(c_across(X1:X8)))

PROX_TERMINAL <- dist_dkijkt_terminal_min$Min/1000
dkijkt_covid_updated <- cbind(dkijkt_covid_updated, PROX_TERMINAL)

Healthcare

healthcare_sf = st_read(dsn = "data/health_facilities", layer = "IDN_hospital_point")
Reading layer `IDN_hospital_point' from data source 
  `C:\JunLonggggg\IS415\IS415_project\data\health_facilities' 
  using driver `ESRI Shapefile'
Simple feature collection with 1616 features and 9 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 95.29627 ymin: -10.1843 xmax: 140.669 ymax: 5.893303
Geodetic CRS:  WGS 84
healthcare <- st_transform(healthcare_sf, crs = 23845)
healthcare_dkijkt <- healthcare %>%
                      filter(Province == "DKI Jakarta") %>%
                      drop_na(District)
dkijkt_covid_geo <- dkijkt_covid_testing1$geometry
dkijkt_covid1 <- st_coordinates(dkijkt_covid_geo)
dkijkt_covid2 <- dkijkt_covid1[,1:2]
healthcare_dkijkt_df <- healthcare_dkijkt$geometry
correctgeo <- st_as_sf(healthcare_dkijkt_df, crs=23845)
healthcare_dkijktgeo <- st_coordinates(correctgeo)
dist_dkijkt_healthcare <- spDists(dkijkt_covid2, healthcare_dkijktgeo, longlat=FALSE)
dist_dkijkt_healthcare_df <- data.frame(dist_dkijkt_healthcare)

dist_dkijkt_healthcare_min <- dist_dkijkt_healthcare_df %>% rowwise() %>% mutate(Min = min(c_across(X1:X129)))

PROX_HEALTHCARE <- dist_dkijkt_healthcare_min$Min/1000
dkijkt_covid_updated <- cbind(dkijkt_covid_updated, PROX_HEALTHCARE)

Railway

railways_sf = st_read(dsn = "data/railways", layer = "hotosm_idn_jakarta_railways_polygons")
Reading layer `hotosm_idn_jakarta_railways_polygons' from data source 
  `C:\JunLonggggg\IS415\IS415_project\data\railways' 
  using driver `ESRI Shapefile'
Simple feature collection with 25 features and 9 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: 106.6518 ymin: -6.530927 xmax: 107.0838 ymax: -6.118495
Geodetic CRS:  WGS 84
railways <- st_transform(railways_sf, crs = 23845)
railways <- st_centroid(railways, of_largest_polygon = TRUE)
dkijkt_covid_geo <- dkijkt_covid_testing1$geometry
dkijkt_covid1 <- st_coordinates(dkijkt_covid_geo)
dkijkt_covid2 <- dkijkt_covid1[,1:2]
railways_df <- railways$geometry
correctgeo <- st_as_sf(railways_df, crs=23845)
railwaysgeo <- st_coordinates(correctgeo)
dist_dkijkt_railways <- spDists(dkijkt_covid2, railwaysgeo, longlat=FALSE)
dist_dkijkt_railways_df <- data.frame(dist_dkijkt_railways)

dist_dkijkt_railways_min <- dist_dkijkt_railways_df %>% rowwise() %>% mutate(Min = min(c_across(X1:X25)))

PROX_RAILWAYS <- dist_dkijkt_railways_min$Min/1000
dkijkt_covid_updated <- cbind(dkijkt_covid_updated, PROX_RAILWAYS)

export a copy

# st_write(dkijkt_covid_updated, "data/dkijkt_covid_updated.csv", layer_options = "GEOMETRY=AS_XY")

Load latest updated csv data.

dkijkt_covid_updated_xy <- read_csv("data/dkijkt_covid_updated.csv")

dkijkt_covid_updated_xy <- st_as_sf(dkijkt_covid_updated_xy,
                          coords = c("X", 
                                     "Y"),
                          crs=23845)

dkijkt_covid_updated_xy_df <- as.data.frame(dkijkt_covid_updated_xy)
colnames(dkijkt_covid_updated_xy_df)
 [1] "OBJECT_ID"          "KODE_DESA"          "DESA"              
 [4] "KODE"               "PROVINSI"           "KAB_KOTA"          
 [7] "KECAMATAN"          "DESA_KELUR"         "JUMLAH_PEN"        
[10] "Nama_provinsi"      "nama_kota"          "nama_kecamatan"    
[13] "nama_kelurahan"     "POSITIF"            "Meninggal"         
[16] "Month"              "Year"               "Month_Year"        
[19] "PROX_ATTRACTION"    "PROX_WORSHIP"       "PROX_RESTAURANT"   
[22] "PROX_MALL"          "PROX_SUPERMARKET"   "PROX_CONVENIENCE"  
[25] "PROX_KINDERGARTENS" "PROX_SCHOOL"        "PROX_TERMINAL"     
[28] "PROX_HEALTHCARE"    "PROX_RAILWAYS"      "geometry"          
library(corrplot)
corrplot(cor(dkijkt_covid_updated_xy_df[, c("POSITIF","JUMLAH_PEN","PROX_ATTRACTION","PROX_WORSHIP","PROX_RESTAURANT","PROX_MALL", "PROX_SUPERMARKET", "PROX_CONVENIENCE", "PROX_KINDERGARTENS", "PROX_SCHOOL", "PROX_TERMINAL", "PROX_HEALTHCARE", "PROX_RAILWAYS")]), diag = FALSE, order = "AOE",
         tl.pos = "td", tl.cex = 0.7, number.cex=0.5, method = "number", type = "upper")

OTHERS

Population Counts (Unconstrained 2020, 1km resolution)

library(raster)
str_name<-'data/population/idn_ppp_2020_1km_Aggregated.tif'

population2020_raster = raster(str_name)
tmap_mode("view")
tm_shape(population2020_raster) + 
  tm_raster(palette = "Paired", alpha = 0.7) +
  tm_basemap("OpenStreetMap")
tmap_mode("plot")

Total Density 2020 Unconstrained, Unadjusted, 1km

library(raster)
str_name<-'data/population/idn_pd_2020_1km.tif'

populationden2020_raster = raster(str_name)
tmap_mode("view")
tm_shape(populationden2020_raster) + 
  tm_raster(palette = "Paired", alpha = 0.7) +
  tm_basemap("OpenStreetMap")
tmap_mode("plot")

Birth 2015

library(raster)
str_name<-'data/birth/IDN_births_pp_v2_2015.tif'

birth_raster = raster(str_name)
tmap_mode("view")
tm_shape(birth_raster) + 
  tm_raster(palette = "Paired", alpha = 0.7) +
  tm_basemap("OpenStreetMap")
tmap_mode("plot")
# colnames(pointsofint_sf)
# lengths(lapply(pointsofint_sf, unique))
# amenity_count = pointsofint_sf %>% 
#   group_by(amenity) %>% 
#   summarise(unique_elements = n_distinct(osm_id))
# amenity_count[order(amenity_count$unique_elements, decreasing = TRUE),] %>% 
#   slice_max(unique_elements,n= 11)
# shop_count = pointsofint_sf %>% 
#   group_by(shop) %>% 
#   summarise(unique_elements = n_distinct(osm_id))
# shop_count[order(shop_count$unique_elements, decreasing = TRUE),] %>% 
#   slice_max(unique_elements,n= 11)

EDA

head(dkijkt_covid_updated)
Simple feature collection with 6 features and 29 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -3627327 ymin: 689925 xmax: -3620624 ymax: 692881.1
Projected CRS: DGN95 / Indonesia TM-3 zone 54.1
  OBJECT_ID  KODE_DESA          DESA   KODE    PROVINSI      KAB_KOTA
1     25477 3173031006     KEAGUNGAN 317303 DKI JAKARTA JAKARTA BARAT
2     25478 3173031007        GLODOK 317303 DKI JAKARTA JAKARTA BARAT
3     25397 3171031003 HARAPAN MULIA 317103 DKI JAKARTA JAKARTA PUSAT
4     25400 3171031006  CEMPAKA BARU 317103 DKI JAKARTA JAKARTA PUSAT
5     25390 3171021001    PASAR BARU 317102 DKI JAKARTA JAKARTA PUSAT
6     25391 3171021002  KARANG ANYAR 317102 DKI JAKARTA JAKARTA PUSAT
    KECAMATAN    DESA_KELUR JUMLAH_PEN Nama_provinsi     nama_kota
1  TAMAN SARI     KEAGUNGAN      21609   DKI JAKARTA JAKARTA BARAT
2  TAMAN SARI        GLODOK       9069   DKI JAKARTA JAKARTA BARAT
3   KEMAYORAN HARAPAN MULIA      29085   DKI JAKARTA JAKARTA PUSAT
4   KEMAYORAN  CEMPAKA BARU      41913   DKI JAKARTA JAKARTA PUSAT
5 SAWAH BESAR    PASAR BARU      15793   DKI JAKARTA JAKARTA PUSAT
6 SAWAH BESAR  KARANG ANYAR      33383   DKI JAKARTA JAKARTA PUSAT
  nama_kecamatan nama_kelurahan POSITIF Meninggal Month Year
1     TAMAN SARI      KEAGUNGAN    1211        13   Okt 2021
2     TAMAN SARI         GLODOK     806        18   Okt 2021
3      KEMAYORAN  HARAPAN MULIA    1946        40   Okt 2021
4      KEMAYORAN   CEMPAKA BARU    3020        66   Okt 2021
5    SAWAH BESAR     PASAR BARU    1646        25   Okt 2021
6    SAWAH BESAR   KARANG ANYAR    1916        37   Okt 2021
  Month_Year PROX_ATTRACTION PROX_WORSHIP PROX_RESTAURANT PROX_MALL
1   Okt_2021       0.5382397    1.0503875       0.3455930 0.3720679
2   Okt_2021       0.4028975    0.3900658       0.2571720 1.0283792
3   Okt_2021       1.4805683    1.9609504       0.8832605 2.7081251
4   Okt_2021       1.7919830    2.8853745       1.0822044 1.8678660
5   Okt_2021       0.2111523    1.2702678       0.1208641 0.6715247
6   Okt_2021       0.6572624    0.4652704       0.5889096 1.0397008
  PROX_SUPERMARKET PROX_CONVENIENCE PROX_KINDERGARTENS PROX_SCHOOL
1        0.6004212        0.3346377         0.17083869   0.6699810
2        0.4333037        0.1725408         0.18755985   1.1314969
3        1.3725264        0.5153894         0.08428513   2.0182440
4        1.8432536        1.1539973         0.27942934   2.5324664
5        2.1670189        0.3324289         0.26575738   0.3335861
6        0.7689729        0.3389033         0.46330566   1.0854266
  PROX_TERMINAL PROX_HEALTHCARE PROX_RAILWAYS
1      20.74123       0.6385436      6.674379
2      20.50052       0.9529990      7.494826
3      26.56168       1.7264388      5.292908
4      27.38963       0.8940009      5.806548
5      23.68299       1.4461887      4.975860
6      22.72081       0.8049696      6.334747
                   geometry
1 POINT (-3627129 692083.5)
2 POINT (-3627327 692881.1)
3   POINT (-3621509 689925)
4 POINT (-3620624 690303.2)
5 POINT (-3624361 690316.3)
6 POINT (-3625164 691811.9)

Histogram for all proximity factors

prx_attraction = ggplot(data=dkijkt_covid_updated_xy_df, aes(x= `PROX_ATTRACTION`)) +
  geom_histogram(bins=20, color="black", fill="light blue")

prx_worship = ggplot(data=dkijkt_covid_updated_xy_df, aes(x= `PROX_WORSHIP`)) +
  geom_histogram(bins=20, color="black", fill="light blue")

prx_restaurant = ggplot(data=dkijkt_covid_updated_xy_df, aes(x= `PROX_RESTAURANT`)) +
  geom_histogram(bins=20, color="black", fill="light blue")

prx_mall = ggplot(data=dkijkt_covid_updated_xy_df, aes(x= `PROX_MALL`)) +
  geom_histogram(bins=20, color="black", fill="light blue")

prx_supermarket = ggplot(data=dkijkt_covid_updated_xy_df, aes(x= `PROX_SUPERMARKET`)) +
  geom_histogram(bins=20, color="black", fill="light blue")

prx_convenience = ggplot(data=dkijkt_covid_updated_xy_df, aes(x= `PROX_CONVENIENCE`)) +
  geom_histogram(bins=20, color="black", fill="light blue")

prx_kindergartens = ggplot(data=dkijkt_covid_updated_xy_df, aes(x= `PROX_KINDERGARTENS`)) +
  geom_histogram(bins=20, color="black", fill="light blue")

prx_schools = ggplot(data=dkijkt_covid_updated_xy_df, aes(x= `PROX_SCHOOL`)) +
  geom_histogram(bins=20, color="black", fill="light blue")

prx_terminal = ggplot(data=dkijkt_covid_updated_xy_df, aes(x= `PROX_TERMINAL`)) +
  geom_histogram(bins=20, color="black", fill="light blue")

prx_healthcare = ggplot(data=dkijkt_covid_updated_xy_df, aes(x= `PROX_HEALTHCARE`)) +
  geom_histogram(bins=20, color="black", fill="light blue")

prx_railways = ggplot(data=dkijkt_covid_updated_xy_df, aes(x= `PROX_RAILWAYS`)) +
  geom_histogram(bins=20, color="black", fill="light blue")

ggarrange(prx_attraction, prx_worship, prx_restaurant, prx_mall, prx_supermarket, prx_convenience, prx_kindergartens, prx_schools, prx_terminal, prx_healthcare, prx_railways,  ncol = 3, nrow = 4)
# ggarrange from ggpubr package
tm_shape(dkijkt_sf23845_main)+
  tm_polygons()

create_map = function(df, vname, legtitle = NA,mtitle = NA){
  tm_shape(df) +
    tm_fill(vname,
            style = "quantile",
            palette = "Blues",
            title = legtitle
            )+
    tm_layout(main.title = mtitle,
              main.title.position = "center",
              main.title.size = 0.8,
              legend.outside = TRUE,
              legend.position = c("right","bottom"),
              frame = TRUE
              )+
    tm_borders(alpha = 0.5)+
    tm_scale_bar(width = 0.15) +
    tm_grid(lwd = 0.1, alpha = 0.2) +
    tm_credits("Source: Open Data Covid-19 Provinsi DKI Jakarta. from Riwayat File Covid-19 DKI Jakarta", 
               position = c("left", "bottom"))
}
positives = create_map(dkijkt_covid, 'POSITIF', "Cumulative Postive Cases as at 31st October 2021")
positives

deaths = create_map(dkijkt_covid, 'Meninggal', "Cumulative Death Cases as at 31st October 2021")
deaths

tm_shape(dkijkt_sf23845_main)+
  tm_polygons() +
tm_shape(dkijkt_covid) +  
  tm_dots(col = "POSITIF",
          alpha = 0.6,
          style="quantile",
          size = 0.5) +
  tm_view(set.zoom.limits = c(11,14))

tm_shape(dkijkt_sf23845_main)+
  tm_polygons() +
tm_shape(dkijkt_covid) +  
  tm_dots(col = "Meninggal",
          alpha = 0.6,
          style="quantile",
          size = 0.5) +
  tm_view(set.zoom.limits = c(11,14))

GWR

Hedonic Price Modelling

dkijkt_covid_updated_xy_df.slr <- lm(formula=POSITIF ~ JUMLAH_PEN, data = dkijkt_covid_updated_xy_df)
summary(dkijkt_covid_updated_xy_df.slr)

Call:
lm(formula = POSITIF ~ JUMLAH_PEN, data = dkijkt_covid_updated_xy_df)

Residuals:
     Min       1Q   Median       3Q      Max 
-3083.59  -484.40   -72.76   500.80  3001.82 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 8.097e+02  9.403e+01   8.612 7.15e-16 ***
JUMLAH_PEN  4.624e-02  1.934e-03  23.904  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 760.5 on 259 degrees of freedom
Multiple R-squared:  0.6881,    Adjusted R-squared:  0.6869 
F-statistic: 571.4 on 1 and 259 DF,  p-value: < 2.2e-16
ggplot(data=dkijkt_covid_updated_xy_df,  
       aes(x=`JUMLAH_PEN`, y=`POSITIF`)) +
  geom_point() +
  geom_smooth(method = lm)

Multi Linear Regression Method

col = c("POSITIF","JUMLAH_PEN","PROX_ATTRACTION","PROX_WORSHIP","PROX_RESTAURANT","PROX_MALL", "PROX_SUPERMARKET", "PROX_CONVENIENCE", "PROX_KINDERGARTENS", "PROX_SCHOOL", "PROX_TERMINAL", "PROX_HEALTHCARE", "PROX_RAILWAYS")
col
 [1] "POSITIF"            "JUMLAH_PEN"         "PROX_ATTRACTION"   
 [4] "PROX_WORSHIP"       "PROX_RESTAURANT"    "PROX_MALL"         
 [7] "PROX_SUPERMARKET"   "PROX_CONVENIENCE"   "PROX_KINDERGARTENS"
[10] "PROX_SCHOOL"        "PROX_TERMINAL"      "PROX_HEALTHCARE"   
[13] "PROX_RAILWAYS"     
dkijkt_covid_updated_xy.mlr = lm(formula = POSITIF ~ JUMLAH_PEN + PROX_ATTRACTION  + PROX_WORSHIP + PROX_RESTAURANT + PROX_MALL  + PROX_SUPERMARKET + PROX_CONVENIENCE  + PROX_KINDERGARTENS  + PROX_SCHOOL  + PROX_TERMINAL  + PROX_HEALTHCARE + PROX_RAILWAYS, data=dkijkt_covid_updated_xy)
summary(dkijkt_covid_updated_xy.mlr)

Call:
lm(formula = POSITIF ~ JUMLAH_PEN + PROX_ATTRACTION + PROX_WORSHIP + 
    PROX_RESTAURANT + PROX_MALL + PROX_SUPERMARKET + PROX_CONVENIENCE + 
    PROX_KINDERGARTENS + PROX_SCHOOL + PROX_TERMINAL + PROX_HEALTHCARE + 
    PROX_RAILWAYS, data = dkijkt_covid_updated_xy)

Residuals:
     Min       1Q   Median       3Q      Max 
-2870.72  -416.30   -55.31   405.69  3012.26 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -5.562e+01  2.147e+02  -0.259  0.79583    
JUMLAH_PEN          4.946e-02  2.361e-03  20.953  < 2e-16 ***
PROX_ATTRACTION     7.069e+01  3.639e+01   1.943  0.05319 .  
PROX_WORSHIP        8.631e+01  4.644e+01   1.858  0.06430 .  
PROX_RESTAURANT    -2.390e+02  7.340e+01  -3.256  0.00129 ** 
PROX_MALL          -2.946e+01  3.768e+01  -0.782  0.43504    
PROX_SUPERMARKET    2.873e+01  4.982e+01   0.577  0.56461    
PROX_CONVENIENCE   -3.194e+01  6.024e+01  -0.530  0.59647    
PROX_KINDERGARTENS -5.914e+01  7.716e+01  -0.766  0.44412    
PROX_SCHOOL         1.518e+01  5.720e+01   0.265  0.79088    
PROX_TERMINAL       2.615e+01  7.912e+00   3.306  0.00109 ** 
PROX_HEALTHCARE    -2.586e+01  5.506e+01  -0.470  0.63904    
PROX_RAILWAYS       2.630e+01  1.487e+01   1.769  0.07820 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 718.1 on 248 degrees of freedom
Multiple R-squared:  0.7337,    Adjusted R-squared:  0.7208 
F-statistic: 56.94 on 12 and 248 DF,  p-value: < 2.2e-16
dkijkt_covid_updated_xy.mlr1 = lm(formula = POSITIF ~ JUMLAH_PEN + PROX_RESTAURANT + PROX_TERMINAL, data=dkijkt_covid_updated_xy)
# summary(dkijkt_covid_updated_xy.mlr1)
ols_regress(dkijkt_covid_updated_xy.mlr1)
                          Model Summary                            
------------------------------------------------------------------
R                       0.848       RMSE                  723.912 
R-Squared               0.720       Coef. Var              26.272 
Adj. R-Squared          0.716       MSE                524049.126 
Pred R-Squared          0.705       MAE                   556.675 
------------------------------------------------------------------
 RMSE: Root Mean Square Error 
 MSE: Mean Square Error 
 MAE: Mean Absolute Error 

                                    ANOVA                                     
-----------------------------------------------------------------------------
                     Sum of                                                  
                    Squares         DF      Mean Square       F         Sig. 
-----------------------------------------------------------------------------
Regression    345557906.531          3    115185968.844      219.8    0.0000 
Residual      134680625.408        257       524049.126                      
Total         480238531.939        260                                       
-----------------------------------------------------------------------------

                                       Parameter Estimates                                        
-------------------------------------------------------------------------------------------------
          model        Beta    Std. Error    Std. Beta      t        Sig        lower      upper 
-------------------------------------------------------------------------------------------------
    (Intercept)     -10.704       186.198                 -0.057    0.954    -377.372    355.963 
     JUMLAH_PEN       0.051         0.002        0.910    22.585    0.000       0.046      0.055 
PROX_RESTAURANT    -208.429        56.519       -0.162    -3.688    0.000    -319.729    -97.130 
  PROX_TERMINAL      33.151         6.443        0.191     5.145    0.000      20.463     45.839 
-------------------------------------------------------------------------------------------------
ols_vif_tol(dkijkt_covid_updated_xy.mlr1)
        Variables Tolerance      VIF
1      JUMLAH_PEN 0.6725599 1.486856
2 PROX_RESTAURANT 0.5659906 1.766814
3   PROX_TERMINAL 0.7955314 1.257021
ols_plot_resid_fit(dkijkt_covid_updated_xy.mlr1)

ols_plot_resid_hist(dkijkt_covid_updated_xy.mlr1)

ols_test_normality(dkijkt_covid_updated_xy.mlr1)
-----------------------------------------------
       Test             Statistic       pvalue  
-----------------------------------------------
Shapiro-Wilk              0.9769          3e-04 
Kolmogorov-Smirnov        0.0752         0.1047 
Cramer-von Mises         21.8659         0.0000 
Anderson-Darling          1.6066          4e-04 
-----------------------------------------------
mlr.output <- as.data.frame(dkijkt_covid_updated_xy.mlr1$residuals)
dkijkt_covid_updated_xy.res.sf <- cbind(dkijkt_covid_updated_xy,  dkijkt_covid_updated_xy.mlr1$residuals) %>%
rename(`MLR_RES` = `dkijkt_covid_updated_xy.mlr1.residuals`)
dkijkt_covid_updated_xy.sp <- as_Spatial(dkijkt_covid_updated_xy.res.sf)
dkijkt_covid_updated_xy.sp
class       : SpatialPointsDataFrame 
features    : 261 
extent      : -3642599, -3607447, 665443.3, 699342.5  (xmin, xmax, ymin, ymax)
crs         : +proj=tmerc +lat_0=0 +lon_0=139.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
variables   : 30
names       : OBJECT_ID,  KODE_DESA,          DESA,   KODE,    PROVINSI,      KAB_KOTA, KECAMATAN,    DESA_KELUR, JUMLAH_PEN, Nama_provinsi,     nama_kota, nama_kecamatan, nama_kelurahan, POSITIF, Meninggal, ... 
min values  :     25384, 3171011001,         ANCOL, 317101, DKI JAKARTA, JAKARTA BARAT,    CAKUNG,         ANCOL,       3088,   DKI JAKARTA, JAKARTA BARAT,         CAKUNG,          ANCOL,     277,         2, ... 
max values  :     25644, 3175101008, WIJAYA KUSUMA, 317510, DKI JAKARTA, JAKARTA UTARA,     TEBET, WIJAYA KUSUMA,     167523,   DKI JAKARTA, JAKARTA UTARA,          TEBET,  WIJAYA KUSUMA,    6607,       169, ... 
tmap_mode("view")
tm_shape(dkijkt_covid)+
  tm_polygons(alpha = 0.4) +
tm_shape(dkijkt_covid_updated_xy.res.sf) +  
  tm_dots(col = "MLR_RES",
          alpha = 0.6,
          style="quantile") +
  tm_view(set.zoom.limits = c(10,15))
tmap_mode("plot")
nb <- dnearneigh(coordinates(dkijkt_covid_updated_xy.sp), 0, 3500, longlat = FALSE)
summary(nb)
Neighbour list object:
Number of regions: 261 
Number of nonzero links: 3810 
Percentage nonzero weights: 5.592989 
Average number of links: 14.5977 
Link number distribution:

 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 
 4  4 11 14 13 12 13 16 16 13  8  7  2  8  9  7  9  3  9  3  5  8  8 
24 25 26 27 28 29 30 31 32 33 
 9 10  7  4  7  9  4  4  3  2 
4 least connected regions:
19 32 149 178 with 1 link
2 most connected regions:
8 120 with 33 links
nb_lw <- nb2listw(nb, style = 'W')
summary(nb_lw)
Characteristics of weights list object:
Neighbour list object:
Number of regions: 261 
Number of nonzero links: 3810 
Percentage nonzero weights: 5.592989 
Average number of links: 14.5977 
Link number distribution:

 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 
 4  4 11 14 13 12 13 16 16 13  8  7  2  8  9  7  9  3  9  3  5  8  8 
24 25 26 27 28 29 30 31 32 33 
 9 10  7  4  7  9  4  4  3  2 
4 least connected regions:
19 32 149 178 with 1 link
2 most connected regions:
8 120 with 33 links

Weights style: W 
Weights constants summary:
    n    nn  S0       S1       S2
W 261 68121 261 60.14567 1057.829
lm.morantest(dkijkt_covid_updated_xy.mlr1, nb_lw)

    Global Moran I for regression residuals

data:  
model: lm(formula = POSITIF ~ JUMLAH_PEN + PROX_RESTAURANT +
PROX_TERMINAL, data = dkijkt_covid_updated_xy)
weights: nb_lw

Moran I statistic standard deviate = 10.287, p-value < 2.2e-16
alternative hypothesis: greater
sample estimates:
Observed Moran I      Expectation         Variance 
    0.2809270492    -0.0104695219     0.0008024067 
bw.fixed <- bw.gwr(formula = POSITIF ~ JUMLAH_PEN + PROX_RESTAURANT + PROX_TERMINAL, data=dkijkt_covid_updated_xy.sp, approach="CV", kernel="gaussian", adaptive=FALSE, longlat=FALSE)
Fixed bandwidth: 26585.08 CV score: 132406301 
Fixed bandwidth: 16433.77 CV score: 123068992 
Fixed bandwidth: 10159.91 CV score: 116106547 
Fixed bandwidth: 6282.457 CV score: 115585107 
Fixed bandwidth: 3886.057 CV score: 116144734 
Fixed bandwidth: 7763.513 CV score: 115426837 
Fixed bandwidth: 8678.856 CV score: 115508497 
Fixed bandwidth: 7197.8 CV score: 115457910 
Fixed bandwidth: 8113.143 CV score: 115435761 
Fixed bandwidth: 7547.43 CV score: 115432835 
Fixed bandwidth: 7897.06 CV score: 115427350 
Fixed bandwidth: 7680.976 CV score: 115428175 
Fixed bandwidth: 7814.523 CV score: 115426633 
Fixed bandwidth: 7846.049 CV score: 115426751 
Fixed bandwidth: 7795.039 CV score: 115426653 
Fixed bandwidth: 7826.565 CV score: 115426655 
Fixed bandwidth: 7807.081 CV score: 115426632 
Fixed bandwidth: 7802.481 CV score: 115426637 
Fixed bandwidth: 7809.924 CV score: 115426631 
Fixed bandwidth: 7811.68 CV score: 115426631 
Fixed bandwidth: 7808.838 CV score: 115426631 
Fixed bandwidth: 7810.595 CV score: 115426631 
Fixed bandwidth: 7811.009 CV score: 115426631 
Fixed bandwidth: 7810.338 CV score: 115426631 
Fixed bandwidth: 7810.753 CV score: 115426631 
Fixed bandwidth: 7810.497 CV score: 115426631 
Fixed bandwidth: 7810.436 CV score: 115426631 
Fixed bandwidth: 7810.534 CV score: 115426631 
Fixed bandwidth: 7810.474 CV score: 115426631 
gwr.fixed <- gwr.basic(formula = POSITIF ~ JUMLAH_PEN + PROX_RESTAURANT + PROX_TERMINAL, data=dkijkt_covid_updated_xy.sp, bw=bw.fixed, kernel = 'gaussian', longlat = FALSE)
gwr.fixed
   ***********************************************************************
   *                       Package   GWmodel                             *
   ***********************************************************************
   Program starts at: 2021-11-16 10:25:03 
   Call:
   gwr.basic(formula = POSITIF ~ JUMLAH_PEN + PROX_RESTAURANT + 
    PROX_TERMINAL, data = dkijkt_covid_updated_xy.sp, bw = bw.fixed, 
    kernel = "gaussian", longlat = FALSE)

   Dependent (y) variable:  POSITIF
   Independent variables:  JUMLAH_PEN PROX_RESTAURANT PROX_TERMINAL
   Number of data points: 261
   ***********************************************************************
   *                    Results of Global Regression                     *
   ***********************************************************************

   Call:
    lm(formula = formula, data = data)

   Residuals:
     Min       1Q   Median       3Q      Max 
-2785.66  -441.82   -80.32   416.29  3063.13 

   Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
   (Intercept)     -1.070e+01  1.862e+02  -0.057 0.954200    
   JUMLAH_PEN       5.071e-02  2.245e-03  22.585  < 2e-16 ***
   PROX_RESTAURANT -2.084e+02  5.652e+01  -3.688 0.000276 ***
   PROX_TERMINAL    3.315e+01  6.443e+00   5.145 5.31e-07 ***

   ---Significance stars
   Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
   Residual standard error: 723.9 on 257 degrees of freedom
   Multiple R-squared: 0.7196
   Adjusted R-squared: 0.7163 
   F-statistic: 219.8 on 3 and 257 DF,  p-value: < 2.2e-16 
   ***Extra Diagnostic information
   Residual sum of squares: 134680625
   Sigma(hat): 721.1119
   AIC:  4183.853
   AICc:  4184.088
   BIC:  3968.498
   ***********************************************************************
   *          Results of Geographically Weighted Regression              *
   ***********************************************************************

   *********************Model calibration information*********************
   Kernel function: gaussian 
   Fixed bandwidth: 7810.474 
   Regression points: the same locations as observations are used.
   Distance metric: Euclidean distance metric is used.

   ****************Summary of GWR coefficient estimates:******************
                          Min.     1st Qu.      Median     3rd Qu.
   Intercept       -496.636248 -227.594285 -138.619288   -2.977636
   JUMLAH_PEN         0.045267    0.051767    0.053604    0.054672
   PROX_RESTAURANT -496.337257 -316.567146 -171.537750  -29.354871
   PROX_TERMINAL      5.552540   27.082474   30.637925   34.620713
                       Max.
   Intercept       951.1443
   JUMLAH_PEN        0.0619
   PROX_RESTAURANT  79.9372
   PROX_TERMINAL    57.1337
   ************************Diagnostic information*************************
   Number of data points: 261 
   Effective number of parameters (2trace(S) - trace(S'S)): 17.06064 
   Effective degrees of freedom (n-2trace(S) + trace(S'S)): 243.9394 
   AICc (GWR book, Fotheringham, et al. 2002, p. 61, eq 2.33): 4116.99 
   AIC (GWR book, Fotheringham, et al. 2002,GWR p. 96, eq. 4.22): 4100.681 
   BIC (GWR book, Fotheringham, et al. 2002,GWR p. 61, eq. 2.34): 3897.552 
   Residual sum of squares: 96928997 
   R-square value:  0.7981649 
   Adjusted R-square value:  0.7839908 

   ***********************************************************************
   Program stops at: 2021-11-16 10:25:03 

Global adjusted r square: 0.7163 GWR adjusted r square: 0.7840

bw.adaptive <- bw.gwr(formula = POSITIF ~ JUMLAH_PEN + PROX_RESTAURANT + PROX_TERMINAL, data=dkijkt_covid_updated_xy.sp, approach="CV", kernel="gaussian",
adaptive=TRUE, longlat=FALSE)
Adaptive bandwidth: 168 CV score: 127081113 
Adaptive bandwidth: 112 CV score: 122235579 
Adaptive bandwidth: 75 CV score: 118408330 
Adaptive bandwidth: 55 CV score: 116647483 
Adaptive bandwidth: 39 CV score: 115449028 
Adaptive bandwidth: 33 CV score: 114960467 
Adaptive bandwidth: 25 CV score: 114908071 
Adaptive bandwidth: 24 CV score: 114609045 
Adaptive bandwidth: 19 CV score: 114667209 
Adaptive bandwidth: 22 CV score: 114530547 
Adaptive bandwidth: 26 CV score: 114945020 
Adaptive bandwidth: 24 CV score: 114609045 
Adaptive bandwidth: 25 CV score: 114908071 
Adaptive bandwidth: 24 CV score: 114609045 
Adaptive bandwidth: 24 CV score: 114609045 
Adaptive bandwidth: 23 CV score: 114491783 
Adaptive bandwidth: 21 CV score: 114577685 
Adaptive bandwidth: 21 CV score: 114577685 
Adaptive bandwidth: 20 CV score: 114690316 
Adaptive bandwidth: 20 CV score: 114690316 
Adaptive bandwidth: 19 CV score: 114667209 
Adaptive bandwidth: 19 CV score: 114667209 
Adaptive bandwidth: 18 CV score: 114440095 
Adaptive bandwidth: 22 CV score: 114530547 
Adaptive bandwidth: 22 CV score: 114530547 
Adaptive bandwidth: 21 CV score: 114577685 
Adaptive bandwidth: 21 CV score: 114577685 
Adaptive bandwidth: 20 CV score: 114690316 
Adaptive bandwidth: 20 CV score: 114690316 
Adaptive bandwidth: 19 CV score: 114667209 
Adaptive bandwidth: 19 CV score: 114667209 
Adaptive bandwidth: 18 CV score: 114440095 

Select bandwith of 18

gwr.adaptive <- gwr.basic(formula = POSITIF ~ JUMLAH_PEN + PROX_RESTAURANT + PROX_TERMINAL, data=dkijkt_covid_updated_xy.sp, bw=bw.adaptive, kernel = 'gaussian', adaptive=TRUE, longlat = FALSE)
gwr.adaptive
   ***********************************************************************
   *                       Package   GWmodel                             *
   ***********************************************************************
   Program starts at: 2021-11-16 10:25:03 
   Call:
   gwr.basic(formula = POSITIF ~ JUMLAH_PEN + PROX_RESTAURANT + 
    PROX_TERMINAL, data = dkijkt_covid_updated_xy.sp, bw = bw.adaptive, 
    kernel = "gaussian", adaptive = TRUE, longlat = FALSE)

   Dependent (y) variable:  POSITIF
   Independent variables:  JUMLAH_PEN PROX_RESTAURANT PROX_TERMINAL
   Number of data points: 261
   ***********************************************************************
   *                    Results of Global Regression                     *
   ***********************************************************************

   Call:
    lm(formula = formula, data = data)

   Residuals:
     Min       1Q   Median       3Q      Max 
-2785.66  -441.82   -80.32   416.29  3063.13 

   Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
   (Intercept)     -1.070e+01  1.862e+02  -0.057 0.954200    
   JUMLAH_PEN       5.071e-02  2.245e-03  22.585  < 2e-16 ***
   PROX_RESTAURANT -2.084e+02  5.652e+01  -3.688 0.000276 ***
   PROX_TERMINAL    3.315e+01  6.443e+00   5.145 5.31e-07 ***

   ---Significance stars
   Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
   Residual standard error: 723.9 on 257 degrees of freedom
   Multiple R-squared: 0.7196
   Adjusted R-squared: 0.7163 
   F-statistic: 219.8 on 3 and 257 DF,  p-value: < 2.2e-16 
   ***Extra Diagnostic information
   Residual sum of squares: 134680625
   Sigma(hat): 721.1119
   AIC:  4183.853
   AICc:  4184.088
   BIC:  3968.498
   ***********************************************************************
   *          Results of Geographically Weighted Regression              *
   ***********************************************************************

   *********************Model calibration information*********************
   Kernel function: gaussian 
   Adaptive bandwidth: 18 (number of nearest neighbours)
   Regression points: the same locations as observations are used.
   Distance metric: Euclidean distance metric is used.

   ****************Summary of GWR coefficient estimates:******************
                          Min.     1st Qu.      Median     3rd Qu.
   Intercept       -1.9794e+03 -5.2107e+02 -2.6186e+02  2.0187e+02
   JUMLAH_PEN       4.3357e-02  5.0092e-02  5.3951e-02  5.6788e-02
   PROX_RESTAURANT -6.6351e+02 -2.5826e+02 -1.1235e+02  2.2107e+01
   PROX_TERMINAL   -6.0618e+01  1.9632e+01  3.2749e+01  4.6321e+01
                        Max.
   Intercept       1714.9820
   JUMLAH_PEN         0.0651
   PROX_RESTAURANT  393.8354
   PROX_TERMINAL     99.1859
   ************************Diagnostic information*************************
   Number of data points: 261 
   Effective number of parameters (2trace(S) - trace(S'S)): 35.44168 
   Effective degrees of freedom (n-2trace(S) + trace(S'S)): 225.5583 
   AICc (GWR book, Fotheringham, et al. 2002, p. 61, eq 2.33): 4116.013 
   AIC (GWR book, Fotheringham, et al. 2002,GWR p. 96, eq. 4.22): 4082.45 
   BIC (GWR book, Fotheringham, et al. 2002,GWR p. 61, eq. 2.34): 3937.295 
   Residual sum of squares: 86096145 
   R-square value:  0.8207221 
   Adjusted R-square value:  0.792427 

   ***********************************************************************
   Program stops at: 2021-11-16 10:25:03 
dkijkt_covid_updated_xy.adaptive <- st_as_sf(gwr.adaptive$SDF) %>%
  st_transform(crs=23845)
dkijkt_covid_updated_xy.adaptive.svy21 <- st_transform(dkijkt_covid_updated_xy.adaptive, 23845)
dkijkt_covid_updated_xy.adaptive.svy21  
Simple feature collection with 261 features and 18 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -3642599 ymin: 665443.3 xmax: -3607447 ymax: 699342.5
Projected CRS: DGN95 / Indonesia TM-3 zone 54.1
First 10 features:
   Intercept JUMLAH_PEN PROX_RESTAURANT PROX_TERMINAL    y      yhat
1  -1144.883 0.05025544        66.10630      67.73917 1211 1368.9261
2  -1057.035 0.04989022       123.53061      62.75091  806  713.6140
3  -1624.827 0.06319143      -303.20579      82.90708 1946 2147.4371
4  -1278.906 0.06421312      -378.67323      70.74178 3020 2940.2480
5  -1123.809 0.05293092        50.91114      65.90108 1646 1279.0166
6  -1425.856 0.05098450       257.30637      77.88037 1916 2197.1946
7  -1728.106 0.04919500       393.83535      90.93856 1937 2286.2548
8   -330.068 0.05110000        30.93707      32.24424 1434 1482.0736
9  -1102.638 0.05461892      -147.15571      65.75262  982  966.0641
10 -1321.143 0.05921778      -182.57629      72.03046 1436 1761.5438
     residual CV_Score Stud_residual Intercept_SE JUMLAH_PEN_SE
1  -157.92610        0   -0.26469295    1032.6646   0.006426165
2    92.38602        0    0.15905050     990.5857   0.005837407
3  -201.43711        0   -0.34005993     707.4829   0.005998712
4    79.75202        0    0.13481834     633.5744   0.005572424
5   366.98341        0    0.64033842     586.9564   0.005215731
6  -281.19459        0   -0.46986078     588.4961   0.004969396
7  -349.25482        0   -0.58690446     598.9546   0.005088091
8   -48.07357        0   -0.07970083     652.6614   0.005379907
9    15.93592        0    0.02831486     611.8777   0.006490386
10 -325.54384        0   -0.54233854     553.4667   0.005345573
   PROX_RESTAURANT_SE PROX_TERMINAL_SE Intercept_TV JUMLAH_PEN_TV
1            382.7858         47.09575   -1.1086691      7.820440
2            372.0011         45.06369   -1.0670810      8.546642
3            260.1057         30.85449   -2.2966307     10.534168
4            221.4217         27.65698   -2.0185566     11.523373
5            273.1516         26.63019   -1.9146384     10.148323
6            266.2923         26.45327   -2.4228813     10.259698
7            281.8163         26.59172   -2.8852034      9.668657
8            287.2065         28.67235   -0.5057263      9.498306
9            286.6446         27.20571   -1.8020559      8.415358
10           247.0637         24.66286   -2.3870326     11.077910
   PROX_RESTAURANT_TV PROX_TERMINAL_TV  Local_R2
1           0.1726979         1.438329 0.8396321
2           0.3320705         1.392494 0.8371292
3          -1.1657022         2.687035 0.7355536
4          -1.7101901         2.557827 0.7153181
5           0.1863842         2.474676 0.8008013
6           0.9662555         2.944074 0.8098282
7           1.3974895         3.419807 0.7993530
8           0.1077171         1.124576 0.8379563
9          -0.5133735         2.416868 0.7979838
10         -0.7389848         2.920605 0.7627244
                    geometry
1  POINT (-3627129 692083.5)
2  POINT (-3627327 692881.1)
3    POINT (-3621509 689925)
4  POINT (-3620624 690303.2)
5  POINT (-3624361 690316.3)
6  POINT (-3625164 691811.9)
7  POINT (-3625381 693399.8)
8  POINT (-3626870 690234.1)
9    POINT (-3623604 689027)
10 POINT (-3622557 689713.1)
gwr.adaptive.output <- as.data.frame(gwr.adaptive$SDF)
dkijkt_covid_updated_xy.adaptive <- cbind(dkijkt_covid_updated_xy.res.sf, as.matrix(gwr.adaptive.output))
glimpse(dkijkt_covid_updated_xy.adaptive)
Rows: 261
Columns: 51
$ OBJECT_ID          <dbl> 25477, 25478, 25397, 25400, 25390, 25391,~
$ KODE_DESA          <dbl> 3173031006, 3173031007, 3171031003, 31710~
$ DESA               <chr> "KEAGUNGAN", "GLODOK", "HARAPAN MULIA", "~
$ KODE               <dbl> 317303, 317303, 317103, 317103, 317102, 3~
$ PROVINSI           <chr> "DKI JAKARTA", "DKI JAKARTA", "DKI JAKART~
$ KAB_KOTA           <chr> "JAKARTA BARAT", "JAKARTA BARAT", "JAKART~
$ KECAMATAN          <chr> "TAMAN SARI", "TAMAN SARI", "KEMAYORAN", ~
$ DESA_KELUR         <chr> "KEAGUNGAN", "GLODOK", "HARAPAN MULIA", "~
$ JUMLAH_PEN         <dbl> 21609, 9069, 29085, 41913, 15793, 33383, ~
$ Nama_provinsi      <chr> "DKI JAKARTA", "DKI JAKARTA", "DKI JAKART~
$ nama_kota          <chr> "JAKARTA BARAT", "JAKARTA BARAT", "JAKART~
$ nama_kecamatan     <chr> "TAMAN SARI", "TAMAN SARI", "KEMAYORAN", ~
$ nama_kelurahan     <chr> "KEAGUNGAN", "GLODOK", "HARAPAN MULIA", "~
$ POSITIF            <dbl> 1211, 806, 1946, 3020, 1646, 1916, 1937, ~
$ Meninggal          <dbl> 13, 18, 40, 66, 25, 37, 36, 24, 16, 26, 5~
$ Month              <chr> "Okt", "Okt", "Okt", "Okt", "Okt", "Okt",~
$ Year               <dbl> 2021, 2021, 2021, 2021, 2021, 2021, 2021,~
$ Month_Year         <chr> "Okt_2021", "Okt_2021", "Okt_2021", "Okt_~
$ PROX_ATTRACTION    <dbl> 0.5382397, 0.4028975, 1.4805683, 1.791983~
$ PROX_WORSHIP       <dbl> 1.050387498, 0.390065771, 1.960950443, 2.~
$ PROX_RESTAURANT    <dbl> 0.3455930, 0.2571720, 0.8832605, 1.082204~
$ PROX_MALL          <dbl> 0.3720679, 1.0283792, 2.7081251, 1.867866~
$ PROX_SUPERMARKET   <dbl> 0.6004212, 0.4333037, 1.3725264, 1.843253~
$ PROX_CONVENIENCE   <dbl> 0.3346377, 0.1725408, 0.5153894, 1.153997~
$ PROX_KINDERGARTENS <dbl> 0.17083869, 0.18755985, 0.08428513, 0.279~
$ PROX_SCHOOL        <dbl> 0.6699810, 1.1314969, 2.0182440, 2.532466~
$ PROX_TERMINAL      <dbl> 20.74123, 20.50052, 26.56168, 27.38963, 2~
$ PROX_HEALTHCARE    <dbl> 0.63854364, 0.95299899, 1.72643881, 0.894~
$ PROX_RAILWAYS      <dbl> 6.6743792, 7.4948262, 5.2929077, 5.806548~
$ MLR_RES            <dbl> -489.57850, -269.16770, -214.54982, 223.0~
$ Intercept          <dbl> -1144.88327, -1057.03515, -1624.82697, -1~
$ JUMLAH_PEN.1       <dbl> 0.05025544, 0.04989022, 0.06319143, 0.064~
$ PROX_RESTAURANT.1  <dbl> 66.10630, 123.53061, -303.20579, -378.673~
$ PROX_TERMINAL.1    <dbl> 67.739168, 62.750911, 82.907078, 70.74178~
$ y                  <dbl> 1211, 806, 1946, 3020, 1646, 1916, 1937, ~
$ yhat               <dbl> 1368.9261, 713.6140, 2147.4371, 2940.2480~
$ residual           <dbl> -157.92610, 92.38602, -201.43711, 79.7520~
$ CV_Score           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,~
$ Stud_residual      <dbl> -0.26469295, 0.15905050, -0.34005993, 0.1~
$ Intercept_SE       <dbl> 1032.6646, 990.5857, 707.4829, 633.5744, ~
$ JUMLAH_PEN_SE      <dbl> 0.006426165, 0.005837407, 0.005998712, 0.~
$ PROX_RESTAURANT_SE <dbl> 382.78576, 372.00111, 260.10571, 221.4217~
$ PROX_TERMINAL_SE   <dbl> 47.09575, 45.06369, 30.85449, 27.65698, 2~
$ Intercept_TV       <dbl> -1.1086691, -1.0670810, -2.2966307, -2.01~
$ JUMLAH_PEN_TV      <dbl> 7.820440, 8.546642, 10.534168, 11.523373,~
$ PROX_RESTAURANT_TV <dbl> 0.1726979, 0.3320705, -1.1657022, -1.7101~
$ PROX_TERMINAL_TV   <dbl> 1.4383286, 1.3924938, 2.6870347, 2.557827~
$ Local_R2           <dbl> 0.8396321, 0.8371292, 0.7355536, 0.715318~
$ coords.x1          <dbl> -3627129, -3627327, -3621509, -3620624, -~
$ coords.x2          <dbl> 692083.5, 692881.1, 689925.0, 690303.2, 6~
$ geometry           <POINT [m]> POINT (-3627129 692083.5), POINT (-~
summary(gwr.adaptive$SDF$yhat)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  507.2  1879.1  2703.2  2746.0  3352.1  7967.5 
tmap_mode("view")
tm_shape(dkijkt_covid)+
  tm_polygons(alpha = 0.1) +
tm_shape(dkijkt_covid_updated_xy.adaptive) +  
  tm_dots(col = "Local_R2",
          border.col = "gray60",
          border.lwd = 1) +
  tm_view(set.zoom.limits = c(10,15))
tmap_mode("plot")
tm_shape(dkijkt_covid[dkijkt_covid$KECAMATAN=="CENGKARENG", ])+
  tm_polygons(alpha = 0.1) +
tm_shape(dkijkt_covid_updated_xy.adaptive) +  
  tm_dots(col = "Local_R2",
          border.col = "gray60",
          border.lwd = 1,
          size= 1.5) +
  tm_view(set.zoom.limits = c(10,15))